home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1999 #2 / Amiga Plus CD - 1999 - No. 2.iso / System-Boost / Workbench / ToolManager / Source / Converter / scan.c < prev    next >
C/C++ Source or Header  |  1998-06-17  |  4KB  |  167 lines

  1. /*
  2.  * scan.c  V3.1
  3.  *
  4.  * ToolManager old preferences file scanner
  5.  *
  6.  * Copyright (C) 1990-98 Stefan Becker
  7.  *
  8.  * This source code is for educational purposes only. You may study it
  9.  * and copy ideas or algorithms from it for your own projects. It is
  10.  * not allowed to use any of the source codes (in full or in parts)
  11.  * in other programs. Especially it is not allowed to create variants
  12.  * of ToolManager or ToolManager-like programs from this source code.
  13.  *
  14.  */
  15.  
  16. #include "converter.h"
  17.  
  18. /* Name for "unnamed" group */
  19. #define GROUP_UNNAMED "unnamed"
  20.  
  21. /* Legal chunk IDs */
  22. static const struct ChunkData {
  23.  ULONG   cd_ID;
  24.  BOOL  (*cd_Func)(void *, struct IFFHandle *, ULONG);
  25. } LegalChunks[] = {
  26.  0,       NULL,
  27.  ID_TMEX, ConvertExecConfig,
  28.  ID_TMIM, ConvertImageConfig,
  29.  ID_TMSO, ConvertSoundConfig,
  30.  ID_TMMO, ConvertMenuConfig,
  31.  ID_TMIC, ConvertIconConfig,
  32.  ID_TMDO, ConvertDockConfig,
  33.  ID_TMAC, ConvertAccessConfig,
  34.  0,       NULL
  35. };
  36.  
  37. /* Check for legal chunk ID */
  38. #define DEBUGFUNCTION IsLegalChunk
  39. static struct ChunkData *IsLegalChunk(struct ChunkData *cd,
  40.                                       struct ContextNode *cn,
  41.                                       struct IFFHandle *iffh)
  42. {
  43.  static BOOL       LISTPending = FALSE; /* LIST Chunk must be pop'ed */
  44.  struct ChunkData *rc;
  45.  
  46.  /* Same chunk? */
  47.  if (cn->cn_ID == cd->cd_ID) {
  48.  
  49.   SCAN_LOG(LOG0(Same Chunk type))
  50.  
  51.   /* Yes, do nothing */
  52.   rc = cd;
  53.  
  54.  } else {
  55.  
  56.   SCAN_LOG(LOG1(New Chunk type, "0x%08lx", cn->cn_ID))
  57.  
  58.   /* Set error code */
  59.   rc = NULL;
  60.  
  61.   /* Get next legal chunk ID */
  62.   while ((cn->cn_ID != (++cd)->cd_ID) && (cd->cd_ID != 0)) {
  63.  
  64.    SCAN_LOG(LOG1(Skipping, "0x%08lx", cd->cd_ID))
  65.   }
  66.  
  67.   /* Legal chunk ID? */
  68.   if (cd->cd_ID != 0) {
  69.  
  70.    /* Yes, close old LIST */
  71.    if ((LISTPending == FALSE) || (PopChunk(iffh) == 0)) {
  72.  
  73.     /* Open next LIST */
  74.     if ((PushChunk(iffh, cd->cd_ID, ID_LIST, IFFSIZE_UNKNOWN) == 0) &&
  75.         (PushChunk(iffh, cd->cd_ID, ID_PROP, IFFSIZE_UNKNOWN) == 0) &&
  76.         (PushChunk(iffh, 0,         ID_OGRP, IFFSIZE_UNKNOWN) == 0) &&
  77.         (WriteChunkBytes(iffh, GROUP_UNNAMED, sizeof(GROUP_UNNAMED))
  78.           == sizeof(GROUP_UNNAMED)) &&
  79.         (PopChunk(iffh) == 0) && /* OGRP */
  80.         (PopChunk(iffh) == 0)) { /* PROP */
  81.  
  82.      /* Chunk is open */
  83.      LISTPending = TRUE;
  84.  
  85.      /* All OK */
  86.      rc = cd;
  87.     }
  88.    }
  89.   }
  90.  }
  91.  
  92.  return(rc);
  93. }
  94.  
  95. /* Scan old preferences file */
  96. #undef  DEBUGFUNCTION
  97. #define DEBUGFUNCTION ScanOldConfig
  98. BOOL ScanOldConfig(struct IFFHandle *oldiffh, struct IFFHandle *newiffh)
  99. {
  100.  struct ChunkData *cd = LegalChunks;
  101.  ULONG             id = 1;
  102.  BOOL              rc = TRUE;
  103.  
  104.  SCAN_LOG(LOG2(Entry, "Old 0x%08x New 0x%08lx", oldiffh, newiffh))
  105.  
  106.  /* Initialize ID lists */
  107.  InitExecIDList();
  108.  InitImageIDList();
  109.  InitSoundIDList();
  110.  
  111.  /* Scan chunks */
  112.  while (rc && (ParseIFF(oldiffh, IFFPARSE_STEP) == 0)) {
  113.   struct ContextNode *cn;
  114.  
  115.   SCAN_LOG(LOG0(Next chunk));
  116.  
  117.   /* Check next chunk */
  118.   if (cn = CurrentChunk(oldiffh)) {
  119.  
  120.    /* Current chunk type or next legal chunk type? */
  121.    if (cd = IsLegalChunk(cd, cn, newiffh)) {
  122.     void *buf;
  123.  
  124.     SCAN_LOG(LOG1(Legal chunk, "0x%08lx", cn->cn_ID))
  125.  
  126.     /* Allocate memory for chunk */
  127.     if (buf = AllocMem(cn->cn_Size, MEMF_PUBLIC)) {
  128.  
  129.      SCAN_LOG(LOG2(Buffer, "0x%08lx (%ld)", buf, cn->cn_Size))
  130.  
  131.      /* Read, convert and leave chunk */
  132.      if ((ReadChunkBytes(oldiffh, buf, cn->cn_Size) == cn->cn_Size)  &&
  133.          ((*cd->cd_Func)(buf, newiffh, id++)) &&
  134.          (ParseIFF(oldiffh, IFFPARSE_STEP) == IFFERR_EOC)) {
  135.  
  136.       SCAN_LOG(LOG0(Chunk converted))
  137.  
  138.       /* Progress report */
  139.       putchar('.');
  140.       fflush(stdout);
  141.  
  142.      } else
  143.       rc = FALSE;
  144.  
  145.      FreeMem(buf, cn->cn_Size);
  146.     } else
  147.      rc = FALSE;
  148.  
  149.    } else {
  150.     SCAN_LOG(LOG1(Unexpected chunk, "0x%08lx", cn->cn_ID))
  151.     rc = FALSE;
  152.    }
  153.  
  154.   } else {
  155.    SCAN_LOG(LOG0(No current chunk?!?))
  156.    rc = FALSE;
  157.   }
  158.  }
  159.  
  160.  /* Free ID lists */
  161.  FreeSoundIDList();
  162.  FreeImageIDList();
  163.  FreeExecIDList();
  164.  
  165.  return(rc);
  166. }
  167.